/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package formula.one.urjc.dueño.controlador;

import formula.one.urjc.Metodos;
import formula.one.urjc.dueño.view.VentanaDueñoEquipo;
import formula.one.urjc.dueño.view.ventanaAviso;
import formula.one.urjc.escuderia.Coche;
import formula.one.urjc.escuderia.Escuderia;
import formula.one.urjc.escuderia.PilotoCoche;
import formula.one.urjc.piloto.Piloto;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

/**
 *
 * @author Javier Aparicio García
 */
public class DueñoEscuderiaEquipoControlador implements ActionListener{
    VentanaDueñoEquipo vista;
    Metodos modelo;
    DueñoEscuderiaContolador controlPadre;
    Escuderia escuderia;
    ArrayList<Coche> cochesSinequipo;
    ArrayList<Piloto>pilotosSinequipo;

    public DueñoEscuderiaEquipoControlador(Metodos modelo, Escuderia escuderia) {
        this.modelo = modelo;
        this.escuderia = escuderia;
        this.vista=new VentanaDueñoEquipo();
        this.cochesSinequipo=new ArrayList<Coche>();
        this.pilotosSinequipo=new ArrayList<Piloto>();
        //añado las acciones a los botones del formulario
        vista.getjBtSacar().addActionListener(this);
        vista.getjBtUnir().addActionListener(this);
    }
    
    public VentanaDueñoEquipo mostrarPantalla(){
         //aplico las propiedades a la vantana
        //que no se pueda cambiar el tamaño
        vista.setResizable(false);
        // que se muestre
        vista.setVisible(true);
        cargarDatos();
       
        return vista;
        
    }

    private void cargarDatos() {
        //cargo los listados
        //cargo los coches
        cochesSinequipo.clear();
        vista.getModelListCoches().clear();
        cargarListCoches();
        //cargo los pilostos
        vista.getModellistPilotos().clear();
        pilotosSinequipo.clear();
        cargarListPilotos();
        //cargo la lista de equipos
        vista.getModelListEquipos().clear();
        cargarListEquipos();
    }

    private void cargarListCoches() {
       for(int i=0;i<escuderia.getCoches().length;i++){
           
           //si existe el coche, y además no está asociado a ningún equipo
           if(escuderia.getCoches()[i]!=null && !isInEquipo(escuderia.getCoches()[i])){
              vista.getModelListCoches().addElement(escuderia.getCoches()[i].resumeToString());
              cochesSinequipo.add(escuderia.getCoches()[i]);
           }
       }
       vista.getjListCoches().setModel(vista.getModelListCoches());
    }

    private void cargarListPilotos() {
        
       for(int i=0;i<escuderia.getPilotosOficiales().size();i++){
           //si no está asociado a ningún equipo
           if(!isInEquipo(escuderia.getPilotosOficiales().get(i))){
              vista.getModellistPilotos().addElement(escuderia.getPilotosOficiales().get(i).resumeToString());
              pilotosSinequipo.add(escuderia.getPilotosOficiales().get(i));
           }
       }
       vista.getjListPilotos().setModel(vista.getModellistPilotos());
    }
    
    private void cargarListEquipos() {
        
        for(int i=0;i<escuderia.getListaCompetidores().size();i++){
            vista.getModelListEquipos().addElement(escuderia.getListaCompetidores().get(i).getPiloto().getNombre() + "-"+escuderia.getListaCompetidores().get(i).getCoche().getModelo());
       }
       vista.getjListEquipos().setModel(vista.getModelListEquipos());
    }
    //metodo para saber si un coche esta asociado a un equipo
   private boolean isInEquipo(Coche c){
       boolean res=false;
       for (int i=0;i<escuderia.getListaCompetidores().size();i++){
           if(escuderia.getListaCompetidores().get(i).getCoche().getModelo().equals(c.getModelo())
                && escuderia.getListaCompetidores().get(i).getCoche().getCualidades().sumCualidades()==c.getCualidades().sumCualidades()){
               res=true;
               break;
           }
       }
       return res;
   }
   //sobreescritura del metodo anterior para ver si un piloto esta asociado a un equipo
   private boolean isInEquipo(Piloto p){
       boolean res=false;
       for (int i=0;i<escuderia.getListaCompetidores().size();i++){
           if(escuderia.getListaCompetidores().get(i).getPiloto().getNombre().equals(p.getNombre()) && escuderia.getListaCompetidores().get(i).getPiloto().getApellidos().equals(p.getApellidos())){
               res=true;
               break;
           }
       }
       return res;
   }

   private boolean comprobarSeleccionSacar(){
       boolean res=false;
       if(!vista.getjListEquipos().isSelectionEmpty()){
           res=true;
       }
       return res;
   }
   private boolean comprobarSeleccionUnion(){
       boolean res=true;
       if(vista.getjListCoches().isSelectionEmpty()){
           res=false;
       }
       if(vista.getjListPilotos().isSelectionEmpty()){
           res=false;
       }
       return res;
   }
   
    @Override
    public void actionPerformed(ActionEvent ae) {
        if(vista.getjBtSacar()==ae.getSource()){
            //deshago el equipo
            if(comprobarSeleccionSacar()){
                escuderia.deshacerEquipo(escuderia.getListaCompetidores().get(vista.getjListEquipos().getSelectedIndex()));
                modelo.modificarEscuderia(escuderia);
                cargarDatos();
            }
        }else if(vista.getjBtUnir()==ae.getSource()){
           if(comprobarSeleccionUnion()){
                //se crea un objeto Piloto coche
                PilotoCoche pC=new PilotoCoche(pilotosSinequipo.get(vista.getjListPilotos().getSelectedIndex()),cochesSinequipo.get(vista.getjListCoches().getSelectedIndex()));
                //se añade a la escuderia
                escuderia.getListaCompetidores().add(pC);
                modelo.modificarEscuderia(escuderia);
                cargarDatos();
                
            }else{
                ventanaAviso.mostrarError(vista, "Deben de estar seleccionados un piloto y un coche a la vez", "Error unión");
            } 
        }
    }

    

    
    
}
